#include<iostream>
using namespace std;
class Date
{
public:
	void Print(/*Date* this*/)
	{
		cout << this->_year << "/" << this->_month << "/" << this->_day << endl;
	}
	// 获取某年某月的天数
	bool leapyear(int year) {
		if (year % 400 == 0 || (year%4==0&&year%100!=0)) {
			return true;
		}
		else {
			return false;
		}
		
	}
	int GetMonthDay(int year, int month) {
		int ret = 0;
		int array[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (month == 2) {
			if (leapyear(year)) {
				ret = 29;
			}
			else {
				ret = array[month];
			}
		}
		else {
			ret = array[month];
		}
		return ret;
	}
	// 全缺省的构造函数
	Date(int year = 1900, int month = 1, int day = 1) {
		if (year < 0 || month <= 0 || month>12 || day <= 0 || day > GetMonthDay(year, month)) {
			cout << "日期错误,赋默认值" << endl;
			_year = 1900;
			_month = 1;
			_day = 1;
		}
		else {
			_year = year;
			_month = month;
			_day = day;
		}
	}
	// 拷贝构造函数
  // d2(d1)
	Date(const Date& d) {
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	// 赋值运算符重载
  // d2 = d3 -> d2.operator=(&d2, d3)
	Date& operator=(const Date& d) {
		if (this != &d) {
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}
	// 析构函数

	~Date() {
	}



	// 日期+=天数

	Date& operator+=(int day) {
		_day = _day + day;
		int ret = GetMonthDay(_year, _month);
		while (_day > ret) {
			_day = _day - ret;
			_month = _month + 1;
			if (_month > 12) {
				_year = _year + 1;
				_month = 1;
			}
			ret = GetMonthDay(_year, _month);
		}
		return *this;
	}



	// 日期+天数

	Date operator+(int day) {
		Date tmp(*this);
		tmp += day;
		return tmp;
	}



	// 日期-天数

	Date operator-(int day) {
		Date tmp = *this;
		tmp -= day;
		tmp.Print();
		return tmp;
	}



	// 日期-=天数

	Date& operator-=(int day) {
		_day = _day - day;
		int ret = 0;
		if (_month == 1) {
			ret = GetMonthDay(_year - 1, 12);
		}
		else {
			ret = GetMonthDay(_year, _month - 1);
		}
		while (_day < 0) {
			_day = _day + ret;
			_month = _month - 1;
			if (_month == 0) {
				_year = _year - 1;
				_month = 12;
			}

			ret = GetMonthDay(_year, _month-1);
		}
		return *this;
	}



	// 前置++

	Date& operator++() {
		*this += 1;
		return *this;
	}



	// 后置++

	Date operator++(int) {
		Date tmp(*this);
		*this += 1;
		return tmp;
	}



	// 后置--

	Date operator--(int) {
		Date tmp(*this);
		*this -= 1;
		return tmp;
	}



	// 前置--

	Date& operator--() {
		*this -= 1;
		return *this;
	}

	// >运算符重载

	bool operator > (const Date& d) {
		if ((_year > d._year )||
			(_year == d._year && _month > d._month) || 
			(_year == d._year && _month == d._month && _day > d._day)) {
			return true;
		}
		else
		{
			return false;
		}
	}



	// ==运算符重载

	bool operator == (const Date& d) {
		if (_year == d._year &&
			_month == d._month &&
			_day == d._day) {
			return true;
		}
		else
		{
			return false;
		}
	}



	// >=运算符重载

	inline bool operator >= (const Date& d) {
		if (_year > d._year ||
			_year == d._year && _month > d._month ||
			_year == d._year && _month == d._month && _day >= d._day) {
			return true;
		}
		else {
			return false;
		}
	}



	// <运算符重载

	bool operator < (const Date& d) {
		if ((_year < d._year )||
			(_year == d._year && _month < d._month) ||
			(_year == d._year && _month == d._month && _day < d._day)) {
			return true;
		}
		else
		{
			return false;
		}
	}



	// <=运算符重载

	bool operator <= (const Date& d) {
		if (_year < d._year ||
			_year == d._year && _month < d._month ||
			_year == d._year && _month == d._month && _day <= d._day) {
			return true;
		}
		else {
			return false;
		}
	}



	// !=运算符重载

	bool operator != (const Date& d) {
		if (_year != d._year || _month != d._month || _day != d._day) {
			return true;
		}
		else {
			return false;
		}
	}



	// 日期-日期 返回天数

	int operator-(const Date& d) {
		int ret = 0;
		while(this->operator>(d)) {
			this->operator--();
			ret++;
		}
		while (this->operator<(d)) {
			this->operator++();
			ret++;
		}
		return ret;
	}

private:

	int _year;

	int _month;

	int _day;

};
int main() {
	Date d1(1000,-41, 01);
	Date d2(1001, 02, 01);
	d1.Print();
	d2.Print();
	cout << d2 - d1 << endl;
	d2.Print();
	Date d3;
	d1 = d2 = d3;
	d1.Print(); 
	d2.Print();
	d3.Print();
	
	return 0;
}

